package com.xbongbong.pay.platform.wechatpay.pojo.response.partner;

import com.alibaba.fastjson.annotation.JSONField;
import com.xbongbong.pay.platform.wechatpay.pojo.response.WeChatBaseResponse;
import lombok.Getter;
import lombok.Setter;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 查询订单返回
 * @author 魏荣杰
 * @date 2021/1/8 16:42
 * @since
 * @version
 */
@Setter
@Getter
public class WeChatPayPartnerQueryOrderResponse extends WeChatBaseResponse {
    private static final long serialVersionUID = 6990107082184831024L;
    /**
     * 服务商申请的公众号或移动应用appid。
     * 示例值：wx8888888888888888
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "sp_appid")
    private String spAppId;
    /**
     * 服务商户号，由微信支付生成并下发
     * 示例值：1230000109
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "sp_mchid")
    private String spMchId;
    /**
     * 子商户申请的公众号或移动应用appid。
     * 示例值：wxd678efh567hg6999
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_appid")
    private String subAppId;
    /**
     * 子商户的商户号，有微信支付生成并下发。
     * 示例值：1900000109
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_mchid")
    private String subMchId;

    /**
     * 商户系统内部订单号，只能是数字、大小写字母_-*且在同一个商户号下唯一，详见【商户订单号】。
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 6, max = 32)
    @JSONField(name="out_trade_no")
    private String outTradeNo;

    /**
     * 微信支付系统生成的订单号。
     * 示例值：1217752501201407033233368018
     */
    @Size(min = 1, max = 32)
    @JSONField(name="transaction_id")
    private String transactionId;
    /**
     * 交易类型，枚举值：
     * JSAPI：公众号支付
     * NATIVE：扫码支付
     * APP：APP支付
     * MICROPAY：付款码支付
     * MWEB：H5支付
     * FACEPAY：刷脸支付
     * 示例值：MICROPAY
     */
    @Size(min = 1, max = 16)
    @JSONField(name="trade_type")
    private String tradeType;
    /**
     * 交易状态，枚举值：
     * SUCCESS：支付成功
     * REFUND：转入退款
     * NOTPAY：未支付
     * CLOSED：已关闭
     * REVOKED：已撤销（付款码支付）
     * USERPAYING：用户支付中（付款码支付）
     * PAYERROR：支付失败(其他原因，如银行返回失败)
     * 示例值：SUCCESS
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name="trade_state")
    private String tradeState;
    /**
     * 交易状态描述
     * 示例值：支付失败，请重新下单支付
     */
    @NotBlank
    @Size(min = 1, max = 256)
    @JSONField(name="trade_state_desc")
    private String tradeStateDesc;
    /**
     * 银行类型，采用字符串类型的银行标识。
     * 示例值：CMC
     */
    @Size(min = 1, max = 16)
    @JSONField(name="bank_type")
    private String bankType;
    /**
     * 附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用
     * 示例值：自定义数据
     */
    @JSONField(name="attach")
    private String attach;
    /**
     * 支付完成时间，遵循rfc3339标准格式，格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE，YYYY-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日 13点29分35秒。
     * 示例值：2018-06-08T10:34:56+08:00
     */
    @Size(min = 1, max = 64)
    @JSONField(name="success_time")
    private String successTime;
    /**
     * 支付者信息
     */
    @NotNull
    @JSONField(name="payer")
    @Valid
    private Payer payer;
    /**
     * 订单金额信息，当支付成功时返回该字段
     */
    @JSONField(name="amount")
    @Valid
    private Amount amount;
    /**
     * 支付场景描述
     */
    @JSONField(name="scene_info")
    @Valid
    private SceneInfo sceneInfo;
    /**
     * 优惠功能，享受优惠时返回该字段
     */
    @JSONField(name="promotion_detail")
    @Valid
    private List<PromotionDetailItem> promotionDetail;

    @Setter
    @Getter
    public static class Payer{

        /**
         * 用户在服务商appid下的唯一标识。
         * 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
         */
        @NotBlank
        @Size(min = 1, max = 128)
        @JSONField(name="sp_openid")
        private String spOpenId;

        /**
         * 用户在子商户appid下的唯一标识。
         * 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
         */
        @Size(min = 1, max = 128)
        @JSONField(name = "sub_openid")
        private String subOpenId;
    }


    @Setter
    @Getter
    public static class Amount{

        /**
         * 订单总金额，单位为分。
         * 示例值：100
         */
        @JSONField(name="payer_total")
        private Integer payerTotal;

        /**
         * 用户支付金额，单位为分。
         * 示例值：100
         */
        @JSONField(name="total")
        private Integer total;

        /**
         * CNY：人民币，境内商户号仅支持人民币。
         * 示例值：CNY
         */
        @JSONField(name="currency")
        private String currency;

        /**
         * 用户支付币种
         * 示例值：CNY
         */
        @JSONField(name="payer_currency")
        private String payerCurrency;
    }

    @Setter
    @Getter
    public static class SceneInfo{

        @Size(min = 1, max = 32)
        @JSONField(name="device_id")
        private String deviceId;
    }


    @Setter
    @Getter
    public static class PromotionDetailItem{
        /**
         * 券ID
         * 示例值：109519
         */
        @NotBlank
        @Size(min = 1, max = 32)
        @JSONField(name="coupon_id")
        private String couponId;

        /**
         * 	优惠名称
         * 示例值：单品惠-6
         */
        @Size(min = 1, max = 64)
        @JSONField(name="name")
        private String name;
        /**
         * GLOBAL：全场代金券
         * SINGLE：单品优惠
         * 示例值：GLOBAL
         */
        @Size(min = 1, max = 32)
        @JSONField(name="scope")
        private String scope;
        /**
         * CASH：充值
         * NOCASH：预充值
         * 示例值：CASH
         */
        @Size(min = 1, max = 32)
        @JSONField(name="type")
        private String type;

        /**
         * 优惠券面额
         * 示例值：100
         */
        @NotNull
        @JSONField(name="amount")
        private Integer amount;
        /**
         * 活动ID
         * 示例值：931386
         */
        @Size(min = 1, max = 32)
        @JSONField(name="stock_id")
        private String stockId;

        /**
         * 微信出资，单位为分
         * 示例值：0
         */
        @JSONField(name="wechatpay_contribute")
        private Integer wechatpayContribute;

        /**
         * 商户出资，单位为分
         * 示例值：0
         */
        @JSONField(name="merchant_contribute")
        private Integer merchantContribute;

        /**
         * 其他出资，单位为分
         * 示例值：0
         */
        @JSONField(name="other_contribute")
        private Integer otherContribute;

        /**
         * CNY：人民币，境内商户号仅支持人民币。
         * 示例值：CNY
         */
        @Size(min = 1, max = 16)
        @JSONField(name="currency")
        private String currency;

        /**
         * 	单品列表信息
         */
        @JSONField(name="goods_detail")
        @Valid
        private List<GoodsDetailItem> goodsDetail;

        @Setter
        @Getter
        public static class GoodsDetailItem{
            /**
             * 商品编码
             * 示例值：M1006
             */
            @NotBlank
            @Size(min = 1, max = 32)
            @JSONField(name="goods_id")
            private String goodsId;
            /**
             * 用户购买的数量
             * 示例值：1
             */
            @NotNull
            @JSONField(name="quantity")
            private Integer quantity;
            /**
             * 商品单价，单位为分
             * 示例值：100
             */
            @NotNull
            @JSONField(name="unit_price")
            private Integer unitPrice;
            /**
             * 商品优惠金额
             * 示例值：0
             */
            @NotNull
            @JSONField(name="discount_amount")
            private int discountAmount;

            /**
             * 商品备注信息
             * 示例值：商品备注信息
             */
            @Size(min = 1, max = 128)
            @JSONField(name="goods_remark")
            private String goodsRemark;
        }
    }
}
